package com.sztz.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.annotation.ExcelProperty;
import com.sztz.vo.CargoItemExcelVo;
import com.sztz.vo.RocarsExcelVo;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 香港货物工具类
 * @author yzy
 * @date 2022/7/21 19:56
 */
@Slf4j
public class RocarsUtils {
    /**
     * 香港货物基础信息数据处理
     * @param data 解析出的excel数据
     * @param cargoItemSeqNo 基础信息的结束位置
     * @author yzy
     * @date 2022/7/21 19:16
     */
     static List<Map<String, String>> mapToRocarPropertyMap(List<Map<Integer, Object>> data, int cargoItemSeqNo) {
        List<Map<Integer, Object>> rocarsList = CollUtil.sub(data, 0, cargoItemSeqNo);
        return rocarsList.stream().filter(item -> item.keySet().size() == 2).map(
                item -> {
                    Map<String, String> newMap = new HashMap<>(8);
                    newMap.put(item.get(0).toString(), item.get(1).toString());
                    return newMap;
                }
        ).collect(Collectors.toList());
    }

    /**
     * 解析出的excel数据转换为Rocars对象
     * @param collect 解析出的excel数据
     * @param rocars 需要转换的Rocars对象
     * @author yzy
     * @date 2022/7/21 19:29
     */
     static void convertToRocars(List<Map<String, String>> collect,RocarsExcelVo rocars){
        collect.forEach(item->{
            Field[] fields = ReflectUtil.getFields(RocarsExcelVo.class);
            for(Field field:fields){
                ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                String excelCellName = annotation.value()[0];
                Optional<Map.Entry<String, String>> first = item.entrySet().stream().filter(value -> StrUtil.equalsAnyIgnoreCase(excelCellName, value.getKey())).findFirst();
                if(first.isPresent()){
                    //打开属性对象的赋值权限
                    field.setAccessible(true);
                    try {
                        field.set(rocars,first.get().getValue());
                    } catch (IllegalAccessException e) {
                        log.error("Rocars对象的{}字段无法赋值",field.getName());
                    }
                }
            }
        });
    }
    /**
     * 解析出的excel数据转换为CargoItem对象列表
     * @param collect 解析出的excel数据
     * @param list 需要转换的CargoItem对象列表
     * @author yzy
     * @date 2022/7/21 19:56
     */
    public static void convertToCargoItemList(List<Map<Integer, Object>> collect, List<CargoItemExcelVo> list){
        collect.remove(0);
        collect.forEach(item->{
            CargoItemExcelVo cargoItem = new CargoItemExcelVo();
            Field[] fields = ReflectUtil.getFields(CargoItemExcelVo.class);
            for(Field field:fields){
                ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                int index = annotation.index();
                //打开属性对象的赋值权限
                field.setAccessible(true);
                try {
                    field.set(cargoItem,item.get(index));
                } catch (IllegalAccessException e) {
                    log.error("CargoItem对象的{}字段无法赋值,index为{}",field.getName(),index);
                }
            }
            list.add(cargoItem);
        });

    }

}
